package com.example.common.utils.xss;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class XssValidator implements ConstraintValidator<Xss, String> {

    /**
     * 这是一个正则表达式，用于匹配HTML标签。它使用了以下模式：
     * <p>
     * <(\\S*?)[^>]*>: 匹配以 < 开头的标签，其中 \\S*? 表示匹配任意非空白字符，直到遇到 > 为止。
     * <.*? />: 匹配自闭合标签，例如 <br />。
     * 这个正则表达式可以用于验证字符串中是否包含HTML标签。如果字符串中包含HTML标签，则返回 true；否则返回 false。
     * 注意：这个正则表达式只能匹配基本的HTML标签，如果需要匹配更复杂的HTML标签，可以根据需要进行修改。
     */
    private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (StringUtils.isBlank(value)) {
            return true;
        }
        return !containsHtml(value);
    }

    public static boolean containsHtml(String value) {
        StringBuilder sHtml = new StringBuilder();
        Pattern pattern = Pattern.compile(HTML_PATTERN);
        /**
         * matcher是一个正则表达式匹配器，它用于在给定的字符串中查找匹配的子串。
         * matcher的find()方法用于查找下一个匹配的子串，如果找到了匹配的子串，则返回true；否则返回false。
         * matcher的group()方法用于获取当前匹配的子串。
         */
        Matcher matcher = pattern.matcher(value);
        while (matcher.find()) {
            sHtml.append(matcher.group());
        }
        return pattern.matcher(sHtml).matches();

    }
}
